home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 February
/
EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso
/
earcd
/
comm2
/
kms20src.lha
/
KMSC
/
access.c
next >
Wrap
C/C++ Source or Header
|
1994-10-14
|
11KB
|
435 lines
/**********************************
* KMS *
**********************************
* ©1992 by BlackMagic Software *
**********************************
* *
**********************************/
#include <KMS/KMS.h>
Prototype UBYTE CheckAccess(struct AreaNode *);
Prototype struct ACLNode *CheckACL(UWORD, STRPTR);
Prototype struct ACLNode *InsertACL(STRPTR);
Prototype VOID RemoveACL(struct ACLNode *);
Prototype VOID ListACL(VOID);
Prototype VOID EditACL(STRPTR);
Prototype BOOL EditACLInfo(struct ACLNode *);
Prototype VOID DeleteACL(STRPTR);
Prototype VOID ListBitNames(VOID);
Prototype BOOL EditBitNames(VOID);
extern struct KMSBase *KMSBase;
extern struct LocalConfig *KMS_LC;
extern STRPTR PPArg;
extern TEXT PathString[LEN_KMSPATH+1];
extern UBYTE ShutDown, Plop;
/****************************************
* Zugangsberechtigung auf Brett prüfen *
****************************************
* I: Zeiger auf Brettstruktur *
* O: Access (Read/Write/Edit) *
****************************************/
/// CheckAccess
UBYTE CheckAccess(struct AreaNode *area)
{
UBYTE access;
if(KMS_LC->Session.CurrentUser->UserData.Level == 255)
return AACC_READ|AACC_WRITE|AACC_EDIT;
access = 0;
if(area->AreaData.ReadLevel <= KMS_LC->Session.CurrentUser->UserData.Level)
access |= AACC_READ;
if(area->AreaData.WriteLevel <= KMS_LC->Session.CurrentUser->UserData.Level)
access |= AACC_WRITE;
if(area->AreaData.EditLevel <= KMS_LC->Session.CurrentUser->UserData.Level)
access |= AACC_EDIT;
if(!access)
return 0;
if((area->AreaData.AccessBits & KMS_LC->Session.CurrentUser->UserData.AccessBits) != area->AreaData.AccessBits)
return 0;
struct ACLNode *acl = CheckACL(area->AreaData.ID, KMS_LC->Session.CurrentUser->UserData.Name);
if(acl)
return acl->Access;
else if(area->AreaData.Type & ATYPE_GROUP)
return 0;
else
return access;
}
///
/****************************************
* Einzelberechtigungs-Prüfung *
****************************************
* I: Area, Username *
* O: ACL-Struktur *
****************************************/
/// CheckACL
struct ACLNode *CheckACL(UWORD id, STRPTR user)
{
struct ACLNode *acl;
UBYTE start = toupper(user[0]) - 'A';
if(start > 25)
start = 25;
if(KMSBase->ACLIndex[start])
acl = KMSBase->ACLIndex[start];
else
return NULL;
while(acl->Node.mln_Succ)
{
if(acl->AreaID == id && !stricmp(acl->UserName, user))
return acl;
acl = acl->Node.mln_Succ;
}
return NULL;
}
///
/********************************
* Neue ACL-Struktur einrichten *
********************************
* I: Username *
* O: struct ACLNode * *
********************************/
/// InsertACL
struct ACLNode *InsertACL(STRPTR user)
{
struct ACLNode *acl, *newacl;
acl = (struct ACLNode *)KMSBase->AccessList.mlh_Head;
while(acl->Node.mln_Succ && stricmp(acl->UserName, user) <= 0)
acl = (struct ACLNode *)acl->Node.mln_Succ;
if(!(newacl = (struct ACLNode *)AllocMem((ULONG)sizeof(struct ACLNode), MEMF_PUBLIC|MEMF_CLEAR)))
{
SystemError("InsertACL", "Out of memory!");
return NULL;
}
strcpy(newacl->UserName, user);
UBYTE idx = toupper(user[0]) - 'A';
if(idx > 25)
idx = 25;
if(!KMSBase->ACLIndex[idx])
KMSBase->ACLIndex[idx] = newacl;
Insert((struct List *)&KMSBase->AccessList, (struct Node *)newacl, (struct Node *)acl->Node.mln_Pred);
return newacl;
}
///
/********************************
* ACL-Struktur löschen *
********************************
* I: struct ACLNode * *
* O: --- *
********************************/
/// RemoveACL
VOID RemoveACL(struct ACLNode *target)
{
if(!target)
return;
KMSBase->Modified |= MODIFIED_ACL;
Remove((struct Node *)target);
FreeMem(target,(ULONG)sizeof(struct ACLNode));
}
///
/********************************
* ACL-Liste zum akt. Brett *
********************************
* I: --- *
* O: --- *
********************************/
/// ListACL
VOID ListACL(VOID)
{
struct ACLNode *acl;
TEXT acc[4];
TEXT buff[40];
UWORD id;
BOOL titel = TRUE;
UBYTE stop = 0;
if(!(KMS_LC->Session.CurrentAccess & AACC_EDIT))
{
PPArg = KMS_LC->Session.InputBuffer;
SysMsg(NO_EDIT_ACCESS);
PPArg = NULL;
return;
}
id = KMS_LC->Session.CurrentArea->AreaData.ID;
acl = (struct ACLNode *)KMSBase->AccessList.mlh_Head;
while(!stop && acl->Node.mln_Succ)
{
strcpy(acc, "---");
if(acl->AreaID == id)
{
if(titel)
{
CreatePath(KMS_LC->Session.CurrentArea);
PPArg = PathString;
SysMsg(ACLLST_HEAD);
PPArg = NULL;
KMS_LC->Session.LineCounter = 6;
titel = FALSE;
}
if(acl->Access & AACC_READ)
acc[0] = KMSBase->AFlags[AFLAG_READ]; /* 'R'ead */
if(acl->Access & AACC_WRITE)
acc[1] = KMSBase->AFlags[AFLAG_WRITE]; /* 'W'rite */
if(acl->Access & AACC_EDIT)
acc[2] = KMSBase->AFlags[AFLAG_EDIT]; /* 'E'dit */
sprintf(buff, "%-31.31s %s\n", acl->UserName, acc);
stop = MsgPrint(buff, 0);
}
acl = (struct ACLNode *)acl->Node.mln_Succ;
}
if(titel)
SysMsg(NO_ACL_FOUND);
}
///
/********************************
* ACL editieren/neu anlegen *
********************************
* I: Username *
* O: --- *
********************************/
VOID EditACL(STRPTR user)
{
struct ACLNode *acl;
if(!(KMS_LC->Session.CurrentAccess & AACC_EDIT))
{
PPArg = KMS_LC->Session.InputBuffer;
SysMsg(NO_EDIT_ACCESS);
PPArg = NULL;
return;
}
if(acl = CheckACL(KMS_LC->Session.CurrentArea->AreaData.ID, user))
{
/* Alten ACL-Eintrag editieren */
if(EditACLInfo(acl))
{
KMS_LC->Session.CurrentAccess = CheckAccess(KMS_LC->Session.CurrentArea);
SysMsg(ACL_MODIFIED);
}
}
else
{
if(!UserCheck(user))
SysMsg(USER_NOT_FOUND);
else
{
if(YNRequest(CREATE_ACL, TRUE))
{
/* Neuen ACL-Eintrag anlegen */
if(acl = InsertACL(user))
{
acl->AreaID = KMS_LC->Session.CurrentArea->AreaData.ID;
if(EditACLInfo(acl))
{
KMS_LC->Session.CurrentAccess = CheckAccess(KMS_LC->Session.CurrentArea);
SysMsg(ACL_CREATED);
}
else
RemoveACL(acl);
}
else
SysMsg(ACL_NOT_CREATED);
}
}
}
}
/********************************
* ACL Eintrag editieren *
********************************
* I: struct ACLNode * *
* O: FALSE: Plop/ShutDown *
********************************/
BOOL EditACLInfo(struct ACLNode *target)
{
TEXT def[2];
KMSBase->Modified |= MODIFIED_ACL;
if(target->Access & AACC_READ)
strcpy(def, KMSBase->Yes);
else
strcpy(def,KMSBase->No);
CmdInput(NULL, PROMPT_ACLREAD, KMSBase->YNText, def, 1, INF_PROMPT|INF_UPCASE);
if(Plop || ShutDown)
return FALSE;
if(*KMS_LC->Session.InputBuffer == KMSBase->YNText[YES])
target->Access |= AACC_READ;
else
target->Access &= ~AACC_READ;
if(target->Access & AACC_WRITE)
strcpy(def, KMSBase->Yes);
else
strcpy(def,KMSBase->No);
CmdInput(NULL, PROMPT_ACLWRITE, KMSBase->YNText, def, 1, INF_PROMPT|INF_UPCASE);
if(Plop || ShutDown)
return FALSE;
if(*KMS_LC->Session.InputBuffer == KMSBase->YNText[YES])
target->Access |= AACC_WRITE;
else
target->Access &= ~AACC_WRITE;
if(target->Access & AACC_EDIT)
strcpy(def,KMSBase->Yes);
else
strcpy(def,KMSBase->No);
CmdInput(NULL, PROMPT_ACLEDIT, KMSBase->YNText, def, 1, INF_PROMPT|INF_UPCASE);
if(Plop || ShutDown)
return FALSE;
if(*KMS_LC->Session.InputBuffer == KMSBase->YNText[YES])
target->Access |= AACC_EDIT;
else
target->Access &= ~AACC_EDIT;
return TRUE;
}
/********************************
* ACL löschen *
********************************
* I: Username *
* O: --- *
********************************/
VOID DeleteACL(STRPTR user)
{
struct ACLNode *acl;
if(!(KMS_LC->Session.CurrentAccess & AACC_EDIT))
{
PPArg = KMS_LC->Session.InputBuffer;
SysMsg(NO_EDIT_ACCESS);
PPArg = NULL;
return;
}
if(acl = CheckACL(KMS_LC->Session.CurrentArea->AreaData.ID, user))
{
if(YNRequest(DELETE_ACL, FALSE))
{
RemoveACL(acl);
SysMsg(ACL_DELETED);
}
}
else
SysMsg(ACL_NOT_FOUND);
}
/********************************
* Zugriffsbit-Namen auflisten *
********************************
* I: --- *
* O: --- *
********************************/
VOID ListBitNames(VOID)
{
UBYTE n;
TEXT buff[81];
SysMsg(BITLST_HEAD);
for(n = 0; n < 32; n += 4)
{
sprintf(buff, "%2d: %-15s %2d: %-15s %2d: %-15s %2d: %-15s", n+1, KMSBase->AccBitNames[n], n+2, KMSBase->AccBitNames[n+1], n+3, KMSBase->AccBitNames[n+2], n+4, KMSBase->AccBitNames[n+3]);
Print(buff, 0);
}
Print(NULL, 0);
}
/********************************
* Zugriffsbit-Namen ändern *
********************************
* I: --- *
* O: FALSE: Plop/ShutDown *
********************************/
BOOL EditBitNames(VOID)
{
LONG result = 1;
while(result > 0 && result < 33)
{
ListBitNames();
result = CmdInput(NULL, PROMPT_BITNUM, NULL, NULL, 2, INF_PROMPT|INF_NUMERIC);
if(Plop || ShutDown)
return FALSE;
if(result > 0 && result < 33)
{
CmdInput(NULL, PROMPT_BITNAME, NULL, KMSBase->AccBitNames[result-1], LEN_ACCBITNAME, INF_PROMPT|INF_UPCASE|INF_DEFBUF);
if(Plop || ShutDown)
return FALSE;
strcpy(KMSBase->AccBitNames[result-1], KMS_LC->Session.InputBuffer);
}
else if(result > 32)
SysMsg(INVALID_BITNUM);
}
return TRUE;
}